home *** CD-ROM | disk | FTP | other *** search
/ C/C++ Users Group Library 1996 July / C-C++ Users Group Library July 1996.iso / vol_200 / 221_01 / cc51.c < prev    next >
Text File  |  1980-01-01  |  7KB  |  363 lines

  1. /* >>>>>>> start of cc5 <<<<<<< */
  2. doexpression()
  3. {
  4.  char *before, *start;
  5.  while(1) {
  6.   setstage(&before, &start);
  7.   expression();
  8.   clearstage(before, start);
  9.   if(ch() != ',') break;
  10.   inbyte();
  11.  }
  12. }
  13.  
  14. expression()
  15. {
  16.  int lval[8];
  17.  if(heir1(lval))rvalue(lval);
  18. }
  19.  
  20. /*
  21. **  inplemented +=, -=, *= etc. operator
  22. **  13-jul-86  Dieter H. Flunkert
  23. */
  24. heir1(lval)
  25.  int lval[];
  26. {
  27.  char *off_set;
  28.  int k, lval2[8];
  29.  lval[2]=lval[3]=1;
  30.  k=heir1a(lval);
  31.  blanks();
  32.  off_set = line + lptr;
  33.  if(streq(off_set, "+=") == 0)
  34.   if(streq(off_set, "-=") == 0)
  35.    if(streq(off_set, "*=") == 0)
  36.     if(streq(off_set, "/=") == 0)
  37.      if(streq(off_set, "%=") == 0)
  38.       if(streq(off_set, "<<=") == 0)
  39.        if(streq(off_set, ">>=") == 0)
  40.         if(streq(off_set,"&=") == 0)
  41.          if(streq(off_set, "|=") == 0)
  42.           if(streq(off_set, "^=") == 0)
  43.            if(ch() != '=') return k;
  44.  if(k==0) {
  45.    needlval();
  46.    return 0;
  47.  }
  48.  if(lval[1]) push();
  49.  else if(ch() != '=') {
  50.    immed();
  51.    outstr(*lval+name);
  52.    nl();
  53.    push();
  54.  }
  55.  if (match("=")) {
  56.   if(heir1(lval2))rvalue(lval2);
  57.  }
  58.  else if(match("+=")) {
  59.   if(heir1(lval2)) rvalue(lval2);
  60.   loadsec();
  61.   pushsec();
  62.   if(cptr=lval[0])
  63.    if((cptr[ident] == pointer) && (cptr[type] == cint) && lval[2]) doublereg();
  64.   add();
  65.  }
  66.  else if(match("-=")) {
  67.   if(heir1(lval2)) rvalue(lval2);
  68.   loadsec();
  69.   pushsec();
  70.   if(cptr=lval[0])
  71.    if((cptr[ident] == pointer) && (cptr[type] == cint) && lval[2]) doublereg();
  72.   sub();
  73.  }
  74.  else if(match("*=")) {
  75.   if(heir1(lval2)) rvalue(lval2);
  76.   loadsec();
  77.   mult();
  78.  }
  79.  else if(match("/=")) {
  80.   if(heir1(lval2)) rvalue(lval2);
  81.   loadsec();
  82.   div();
  83.  }
  84.  else if(match("%=")) {
  85.   if(heir1(lval2)) rvalue(lval2);
  86.   loadsec();
  87.   mod();
  88.  }
  89.  else if(match(">>=")) {
  90.   if(heir1(lval2)) rvalue(lval2);
  91.   loadsec();
  92.   pushsec();
  93.   asr();
  94.  }
  95.  else if(match("<<=")) {
  96.   if(heir1(lval2)) rvalue(lval2);
  97.   loadsec();
  98.   pushsec();
  99.   asl();
  100.  }
  101.  else if(match("&=")) {
  102.   if(heir1(lval2)) rvalue(lval2);
  103.   loadsec();
  104.   pushsec();
  105.   and();
  106.  }
  107.  else if(match("^=")) {
  108.   if(heir1(lval2)) rvalue(lval2);
  109.   loadsec();
  110.   pushsec();
  111.   xor();
  112.  }
  113.  else if(match("|=")) {
  114.   if(heir1(lval2)) rvalue(lval2);
  115.   loadsec();
  116.   pushsec();
  117.   or();
  118.  }
  119.  store(lval);
  120.  return 0;
  121. }
  122. /*
  123. ** '?:', '&&' and '||' operator implemented
  124. ** Dieter H. Flunkert          18-jul-86
  125. */
  126. heir1a(lval)
  127.    int lval[];
  128. {
  129.    int k, lab, endlab;
  130.    k=heir1b(lval);
  131.    if(match("?")) {
  132.    if(k) rvalue(lval); 
  133.     testjump(lab=getlabel());
  134.     endlab=getlabel();
  135.     if(heir1a(lval)) rvalue(lval);
  136.     jump(endlab);
  137.     needbrack(":");
  138.     postlabel(lab);
  139.     if(heir1a(lval)) rvalue(lval);
  140.     postlabel(endlab);
  141.     return 0;
  142.    }
  143.    else return k;
  144. }
  145. heir1b(lval)
  146.    int lval[];
  147. {
  148.    int k, lval2[8], lab, endlab;
  149.    k=heir1c(lval);
  150.    blanks();
  151.    if(streq(line+lptr,"||") == 0) return k;
  152.    if(k) rvalue(lval);
  153.    while(1) {
  154.     if(match("||")) {
  155.      testtruejump(endlab=getlabel());
  156.      if(heir1c(lval2)) rvalue(lval2);
  157.      testtruejump(endlab);
  158.      immed();
  159.      outdec(0);nl();
  160.      jump(lab=getlabel());
  161.      postlabel(endlab);
  162.      immed();
  163.      outdec(1);nl();
  164.      postlabel(lab);
  165.     }
  166.     else return 0;
  167.    }
  168. }
  169. heir1c(lval)
  170.    int lval[];
  171. {
  172.    int k, lval2[8], endlab;
  173.    k=heir2(lval);
  174.    blanks();
  175.    if(streq(line+lptr,"&&") == 0) return k;
  176.    if(k) rvalue(lval);
  177.    while(1) { 
  178.     if(match("&&")) {
  179.      testnoopt(endlab=getlabel());
  180.      if(heir2(lval2)) rvalue(lval2);
  181.      testnoopt(endlab);
  182.      immed();
  183.      outdec(1);
  184.      nl();
  185.      postlabel(endlab);
  186.     }
  187.     else return 0;
  188.    }
  189. }
  190.  
  191. heir2(lval)
  192.  int lval[];
  193. { int k,lval2[8];
  194.  k=heir3(lval);
  195.  blanks();
  196.  if(ch()!='|')return (k);
  197.  if(streq(line+lptr,"|=")) return k;
  198.  if(k)rvalue(lval);
  199.  while(1)
  200.   {if(streq(line+lptr,"||")) return 0;
  201.   if (match("|"))
  202.    {push();
  203.    if(heir3(lval2)) rvalue(lval2);
  204. /*   pop();  */
  205.    or();
  206.    }
  207.   else return (0);
  208.   }
  209. }
  210. heir3(lval)
  211.  int lval[];
  212. { int k,lval2[8];
  213.  k=heir4(lval);
  214.  blanks();
  215.  if(ch()!='^')return (k);
  216.  if(streq(line+lptr,"^=")) return k;
  217.  if(k)rvalue(lval);
  218.  while(1)
  219.   {if (match("^"))
  220.    {push();
  221.    if(heir4(lval2))rvalue(lval2);
  222. /*   pop();  */
  223.    xor();
  224.    }
  225.   else return (0);
  226.   }
  227. }
  228. heir4(lval)
  229.  int lval[];
  230. { int k,lval2[8];
  231.  k=heir5(lval);
  232.  blanks();
  233.  if(ch()!='&')return (k);
  234.  if(streq(line+lptr,"&=")) return k;
  235.  if(k)rvalue(lval);
  236.  while(1)
  237.   {if(streq(line+lptr,"&&")) return 0;
  238.   if (match("&"))
  239.    {push();
  240.    if(heir5(lval2))rvalue(lval2);
  241. /*   pop(); */
  242.    and();
  243.    }
  244.   else return (0);
  245.   }
  246. }
  247. heir5(lval)
  248.  int lval[];
  249. {
  250.  int k,lval2[8];
  251.  char *off_set;
  252.  k=heir6(lval);
  253.  off_set=line+lptr;
  254.  blanks();
  255.  if((streq(off_set,"==")==0)&&
  256.   (streq(off_set,"!=")==0))return (k);
  257.  if(k)rvalue(lval);
  258.  while(1)
  259.   {if (match("=="))
  260.    {push();
  261.    if(heir6(lval2))rvalue(lval2);
  262. /*   pop(); */
  263.    eq();
  264.    }
  265.   else if (match("!="))
  266.    {push();
  267.    if(heir6(lval2))rvalue(lval2);
  268. /*   pop(); */
  269.    ne();
  270.    }
  271.   else return (0);
  272.   }
  273. }
  274. heir6(lval)
  275.  int lval[];
  276. {
  277.  int k,lval2[8];
  278.  char *off_set;
  279.  k=heir7(lval);
  280.  blanks();
  281.  off_set=line+lptr;
  282.  if((ch()!='<') & (ch() != '>') &
  283.  (streq(off_set,"<=")==0) & (streq(off_set,">=")==0)) return (k);
  284.  if(streq(off_set,">>"))return (k);
  285.  if(streq(off_set,"<<"))return (k);
  286.  if(streq(off_set,">>=")) return k;
  287.  if(streq(off_set,"<<=")) return k;
  288.  if(k)rvalue(lval);
  289.  while(1)
  290.   {if (match("<="))
  291.    {push();
  292.    if(heir7(lval2))rvalue(lval2);
  293.    if(cptr=lval[0])
  294.     if((cptr[ident]==pointer)&&lval[2])
  295.     {
  296.     ule();
  297.     continue;
  298.     }
  299.    if(cptr=lval2[0])
  300.     if((cptr[ident]==pointer)&&lval[2])
  301.     {
  302.     ule();
  303.     continue;
  304.     }
  305.    le();
  306.    }
  307.   else if (match(">="))
  308.    {push();
  309.    if(heir7(lval2))rvalue(lval2);
  310.    if(cptr=lval[0])
  311.     if((cptr[ident]==pointer)&&lval[2])
  312.     {
  313.     uge();
  314.     continue;
  315.     }
  316.    if(cptr=lval2[0])
  317.     if((cptr[ident]==pointer)&&lval[2])
  318.     {
  319.     uge();
  320.     continue;
  321.     }
  322.    ge();
  323.    }
  324.   else if(ch() == '<')
  325.    {inbyte();
  326.    push();
  327.    if(heir7(lval2))rvalue(lval2);
  328.    if(cptr=lval[0])
  329.     if((cptr[ident]==pointer)&&lval[2])
  330.     {
  331.     ult();
  332.     continue;
  333.     }
  334.    if(cptr=lval2[0])
  335.     if((cptr[ident]==pointer)&&lval[2])
  336.     {
  337.     ult();
  338.     continue;
  339.     }
  340.    lt();
  341.    }
  342.   else if(ch() == '>')
  343.    {inbyte();
  344.    push();
  345.    if(heir7(lval2))rvalue(lval2);
  346.    if(cptr=lval[0])
  347.     if((cptr[ident]==pointer)&&lval[2])
  348.     {
  349.     ugt();
  350.     continue;
  351.     }
  352.    if(cptr=lval2[0])
  353.     if((cptr[ident]==pointer)&&lval[2])
  354.     {
  355.     ugt();
  356.     continue;
  357.     }
  358.    gt();
  359.    }
  360.   else return (0);
  361.   }
  362. }
  363.